src/Application.cc
changeset 409 1a03ff151abc
parent 408 e6cfc44266af
child 411 106aaf6eadfe
equal deleted inserted replaced
408:e6cfc44266af 409:1a03ff151abc
     1 
     1 
     2 #include "Application.hh"
     2 #include "Application.hh"
     3 
     3 
     4 #include <stdexcept>
     4 #include <stdexcept>
       
     5 #include <sstream>
     5 #include <cstdio>
     6 #include <cstdio>
     6 #include <cassert>
     7 #include <cassert>
     7 
     8 
     8 enum ArgumentCodes {
     9 enum ArgumentCodes {
     9     ARG_HELP        = 'h',
    10     ARG_HELP        = 'h',
    12     ARG_CLIENT      = 'c',
    13     ARG_CLIENT      = 'c',
    13     ARG_GRAPHICS    = 'g',
    14     ARG_GRAPHICS    = 'g',
    14     ARG_FULLSCREEN  = 'F',
    15     ARG_FULLSCREEN  = 'F',
    15     ARG_RESOLUTION  = 'R',
    16     ARG_RESOLUTION  = 'R',
    16 
    17 
    17     ARG_LIST_MODES  = 0xff01,
    18     ARG_LIST_MODES      = 0xff01,
    18     ARG_VERSION     = 0xff02,
    19     ARG_VERSION         = 0xff02,
       
    20     ARG_TERRAIN_SEED    = 0xff03,
       
    21     ARG_TERRAIN_SIZE    = 0xff04,
       
    22 
    19 };
    23 };
    20 
    24 
       
    25         
       
    26 Main::Main (void) :
       
    27     graphics_enabled(false),
       
    28     net_port(NETWORK_PORT_STR),
       
    29     net_server(false),
       
    30     net_connect("")
       
    31 {
       
    32 
       
    33 }
    21 
    34 
    22 /**
    35 /**
    23  * Set the arg_* members
    36  * Set the arg_* members
    24  */
    37  */
    25 bool Main::parse_args (int argc, char **argv) {
    38 bool Main::parse_args (int argc, char **argv) {
    46             "set graphics resolution");
    59             "set graphics resolution");
    47     
    60     
    48     args.add_option(ARG_LIST_MODES, "list-modes", "",
    61     args.add_option(ARG_LIST_MODES, "list-modes", "",
    49             "output a list of available display modes and exit");
    62             "output a list of available display modes and exit");
    50 
    63 
       
    64     args.add_option(ARG_TERRAIN_SEED, "terrain-seed", "SEED",
       
    65             "set seed for terrain random generator");
       
    66 
       
    67     args.add_option(ARG_TERRAIN_SIZE, "terrain-size", "WIDTHxHEIGHT",
       
    68             "set terrain size for random generator");
       
    69 
    51     args.add_option(ARG_VERSION, "version", "",
    70     args.add_option(ARG_VERSION, "version", "",
    52             "output application version and exit");
    71             "output application version and exit");
    53 
       
    54     // set defaults
       
    55     arg_graphics = false;
       
    56     arg_port = NETWORK_PORT_STR;
       
    57     arg_server = false;
       
    58     arg_connect = "";
       
    59     graphics.fullscreen = GRAPHICS_FULLSCREEN;
       
    60     graphics.resolution = PixelCoordinate(GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT);
       
    61 
    72 
    62     // extra state
    73     // extra state
    63     bool resolution_default = true;
    74     bool resolution_default = true;
    64     
    75     
    65     try {
    76     try {
    75             case ARG_HELP:
    86             case ARG_HELP:
    76                 args.print_help();
    87                 args.print_help();
    77                 return false;
    88                 return false;
    78 
    89 
    79             case ARG_PORT:
    90             case ARG_PORT:
    80                 arg_port = args.get_argument();
    91                 net_port = args.get_argument();
    81                 break;
    92                 break;
    82 
    93 
    83             case ARG_SERVER:
    94             case ARG_SERVER:
    84                 arg_server = true;
    95                 net_server = true;
    85                 break;
    96                 break;
    86 
    97 
    87             case ARG_CLIENT:
    98             case ARG_CLIENT:
    88                 arg_connect = args.get_argument();
    99                 net_connect = args.get_argument();
    89                 break;
   100                 break;
    90 
   101 
    91             case ARG_GRAPHICS:
   102             case ARG_GRAPHICS:
    92                 arg_graphics = true;
   103                 graphics_enabled = true;
    93                 break;
   104                 break;
    94 
   105 
    95             case ARG_FULLSCREEN:
   106             case ARG_FULLSCREEN:
    96                 graphics.fullscreen = true;
   107                 graphics.fullscreen = true;
    97                 
   108                 
   104                 }
   115                 }
   105 
   116 
   106                 break;
   117                 break;
   107 
   118 
   108             case ARG_RESOLUTION:
   119             case ARG_RESOLUTION:
   109                 parse_arg_resolution(args.get_argument());
   120                 graphics.resolution = parse_arg_dimensions(args.get_argument(), "--resolution");
   110                 resolution_default = false;
   121                 resolution_default = false;
   111                 break;
   122                 break;
   112 
   123 
   113             case ARG_LIST_MODES:
   124             case ARG_LIST_MODES:
   114                 dump_display_modes();
   125                 dump_display_modes();
   116 
   127 
   117             case ARG_VERSION:
   128             case ARG_VERSION:
   118                 dump_version();
   129                 dump_version();
   119                 return false;
   130                 return false;
   120 
   131 
       
   132             case ARG_TERRAIN_SEED:
       
   133                 terrain.random_seed = parse_arg_int(args.get_argument(), "--terrain-seed");
       
   134                 break;
       
   135 
       
   136             case ARG_TERRAIN_SIZE:
       
   137                 terrain.dimensions = parse_arg_dimensions(args.get_argument(), "--terrain-size");
       
   138                 break;
       
   139 
   121             case CL_CommandLine::REST_ARG:
   140             case CL_CommandLine::REST_ARG:
   122                 throw ArgumentError(args.get_argument());
   141                 throw ArgumentError("Trailing arguments: " + args.get_argument());
   123 
   142 
   124             default:
   143             default:
   125                 throw ArgumentError(std::string(1, (char) args.get_key()));
   144                 throw ArgumentError(std::string() + "Unknown argument key: " + (char) args.get_key());
   126 
   145 
   127         }
   146         }
   128     }
   147     }
   129 
   148 
   130     // check for invalid combinations of arugments
   149     // check for invalid combinations of arugments
   131     if (arg_server and !arg_connect.empty())
   150     if (net_server and !net_connect.empty())
   132         throw ArgumentError("cannot be both server and client");
   151         throw ArgumentError("cannot be both server and client");
   133 
   152 
   134     // enable graphics by default unless server
   153     // enable graphics by default unless server
   135     if (!arg_server)
   154     if (!net_server)
   136         arg_graphics = true;
   155         graphics_enabled = true;
   137     
   156     
   138     // continue
   157     // continue
   139     return true;
   158     return true;
   140 }
   159 }
   141         
   160         
   142 void Main::parse_arg_resolution (const std::string &val) {
   161 int Main::parse_arg_int (const std::string &arg_val, const char *arg_name) {
       
   162     int int_val;
       
   163     
       
   164     // read using istringstream
       
   165     std::istringstream ss(arg_val);
       
   166     
       
   167     if (!(ss >> int_val))
       
   168         throw ArgumentError(std::string() + "invalid integer arugment for " + arg_name + ": " + arg_val);
       
   169 
       
   170     return int_val;
       
   171 }
       
   172 
       
   173 PixelCoordinate Main::parse_arg_dimensions (const std::string &arg_val, const char *arg_name) {
   143     unsigned int w, h;
   174     unsigned int w, h;
   144     
   175     
   145     // sccanf as unsigned
   176     // sccanf as unsigned
   146     if (sscanf(val.c_str(), "%ux%u", &w, &h) != 2)
   177     if (sscanf(arg_val.c_str(), "%ux%u", &w, &h) != 2)
   147         throw ArgumentError("invalid format for --resolution");
   178         throw ArgumentError(std::string() + "invalid format for " + arg_name + ": " + arg_val);
   148     
   179     
   149     // store as PixelCoordinate
   180     return PixelCoordinate(w, h);
   150     graphics.resolution = PixelCoordinate(w, h);
       
   151 }
   181 }
   152         
   182         
   153 void Main::dump_display_modes (void) {
   183 void Main::dump_display_modes (void) {
   154     const std::vector<CL_DisplayMode> &modes = Graphics::getDisplayModes();
   184     const std::vector<CL_DisplayMode> &modes = Graphics::getDisplayModes();
   155     
   185     
   178         if (parse_args(argc, argv) == false)
   208         if (parse_args(argc, argv) == false)
   179             return 0;
   209             return 0;
   180 
   210 
   181         // our engine
   211         // our engine
   182         Engine engine;
   212         Engine engine;
       
   213 
       
   214         // setup game unless client
       
   215         if (net_connect.empty())
       
   216             engine.setupGame(terrain);
   183         
   217         
   184         // setup graphics
   218         // setup graphics
   185         if (arg_graphics)
   219         if (graphics_enabled)
   186             engine.setupGraphics(graphics);
   220             engine.setupGraphics(graphics);
   187 
   221 
   188         // setup either network server, client or singleplayer
   222         // setup either network server, client or singleplayer
   189         if (arg_server) {
   223         if (net_server) {
   190             engine.setupNetworkServer(arg_port);
   224             engine.setupNetworkServer(net_port);
   191 
   225 
   192         } else if (!arg_connect.empty()) {
   226         } else if (!net_connect.empty()) {
   193             engine.setupNetworkClient(arg_connect, arg_port);
   227             engine.setupNetworkClient(net_connect, net_port);
   194         
   228         
   195         } else {
   229         } else {
   196             engine.setupSinglePlayer();
   230             engine.setupSinglePlayer();
   197         }
   231         }
   198 
   232