src/Application.cc
author Tero Marttila <terom@fixme.fi>
Wed, 21 Jan 2009 00:21:42 +0200
changeset 409 1a03ff151abc
parent 408 e6cfc44266af
child 411 106aaf6eadfe
permissions -rw-r--r--
add --terrain-seed and --terrain-size arguments, plus bugfixes
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     1
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
     2
#include "Application.hh"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     3
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     4
#include <stdexcept>
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
     5
#include <sstream>
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
     6
#include <cstdio>
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     7
#include <cassert>
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     8
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
     9
enum ArgumentCodes {
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    10
    ARG_HELP        = 'h',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    11
    ARG_PORT        = 'p',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    12
    ARG_SERVER      = 's',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    13
    ARG_CLIENT      = 'c',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    14
    ARG_GRAPHICS    = 'g',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    15
    ARG_FULLSCREEN  = 'F',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    16
    ARG_RESOLUTION  = 'R',
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    17
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    18
    ARG_LIST_MODES      = 0xff01,
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    19
    ARG_VERSION         = 0xff02,
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    20
    ARG_TERRAIN_SEED    = 0xff03,
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    21
    ARG_TERRAIN_SIZE    = 0xff04,
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    22
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    23
};
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    24
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    25
        
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    26
Main::Main (void) :
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    27
    graphics_enabled(false),
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    28
    net_port(NETWORK_PORT_STR),
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    29
    net_server(false),
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    30
    net_connect("")
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    31
{
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    32
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    33
}
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    34
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    35
/**
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    36
 * Set the arg_* members
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    37
 */
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    38
bool Main::parse_args (int argc, char **argv) {
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    39
    // set up the options
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    40
    args.add_option(ARG_HELP, "help", "",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    41
            "display argument help and exit");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    42
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    43
    args.add_option(ARG_PORT, "port", "PORT",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    44
            "set network port used");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    45
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    46
    args.add_option(ARG_SERVER, "server", "",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    47
            "act as a network server");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    48
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    49
    args.add_option(ARG_CLIENT, "client", "SERVERHOST",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    50
            "act as a network client");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    51
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    52
    args.add_option(ARG_GRAPHICS, "graphics", "",        
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    53
            "run graphics/local input. Implied with --connect");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    54
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    55
    args.add_option(ARG_FULLSCREEN, "fullscreen", "",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    56
            "run graphics in fullscreen mode");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    57
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    58
    args.add_option(ARG_RESOLUTION, "resolution", "WIDTHxHEIGHT",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    59
            "set graphics resolution");
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    60
    
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    61
    args.add_option(ARG_LIST_MODES, "list-modes", "",
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    62
            "output a list of available display modes and exit");
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    63
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    64
    args.add_option(ARG_TERRAIN_SEED, "terrain-seed", "SEED",
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    65
            "set seed for terrain random generator");
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    66
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    67
    args.add_option(ARG_TERRAIN_SIZE, "terrain-size", "WIDTHxHEIGHT",
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    68
            "set terrain size for random generator");
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    69
397
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
    70
    args.add_option(ARG_VERSION, "version", "",
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
    71
            "output application version and exit");
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
    72
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    73
    // extra state
392
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
    74
    bool resolution_default = true;
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    75
    
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    76
    try {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    77
        // parse args
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    78
        args.parse_args(argc, argv);
267
2cb6f1421e45 enable graphics by default unless --server
terom
parents: 185
diff changeset
    79
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    80
    } catch (CL_Error &e) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    81
        throw ArgumentError(e.message);
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    82
    }
267
2cb6f1421e45 enable graphics by default unless --server
terom
parents: 185
diff changeset
    83
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    84
    while (args.next()) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    85
        switch (args.get_key()) {
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    86
            case ARG_HELP:
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    87
                args.print_help();
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    88
                return false;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    89
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    90
            case ARG_PORT:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    91
                net_port = args.get_argument();
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    92
                break;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    93
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    94
            case ARG_SERVER:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    95
                net_server = true;
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    96
                break;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
    97
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
    98
            case ARG_CLIENT:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    99
                net_connect = args.get_argument();
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   100
                break;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   101
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   102
            case ARG_GRAPHICS:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   103
                graphics_enabled = true;
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   104
                break;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   105
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   106
            case ARG_FULLSCREEN:
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 397
diff changeset
   107
                graphics.fullscreen = true;
392
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   108
                
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   109
                // choose best resolution unless explicitly set
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   110
                if (resolution_default) {
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   111
                    const CL_DisplayMode best_mode = Graphics::getBestMode();
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   112
                    const CL_Size best_resolution = best_mode.get_resolution();
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   113
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 397
diff changeset
   114
                    graphics.resolution = PixelCoordinate(best_resolution.width, best_resolution.height);
392
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   115
                }
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   116
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   117
                break;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   118
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   119
            case ARG_RESOLUTION:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   120
                graphics.resolution = parse_arg_dimensions(args.get_argument(), "--resolution");
392
6c4dc68360eb remove unused graphics_default, and default to the highest resolution available in fullscreen mode
Tero Marttila <terom@fixme.fi>
parents: 389
diff changeset
   121
                resolution_default = false;
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   122
                break;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   123
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   124
            case ARG_LIST_MODES:
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   125
                dump_display_modes();
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   126
                return false;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   127
397
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   128
            case ARG_VERSION:
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   129
                dump_version();
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   130
                return false;
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   131
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   132
            case ARG_TERRAIN_SEED:
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   133
                terrain.random_seed = parse_arg_int(args.get_argument(), "--terrain-seed");
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   134
                break;
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   135
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   136
            case ARG_TERRAIN_SIZE:
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   137
                terrain.dimensions = parse_arg_dimensions(args.get_argument(), "--terrain-size");
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   138
                break;
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   139
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   140
            case CL_CommandLine::REST_ARG:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   141
                throw ArgumentError("Trailing arguments: " + args.get_argument());
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   142
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   143
            default:
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   144
                throw ArgumentError(std::string() + "Unknown argument key: " + (char) args.get_key());
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   145
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   146
        }
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   147
    }
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   148
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   149
    // check for invalid combinations of arugments
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   150
    if (net_server and !net_connect.empty())
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   151
        throw ArgumentError("cannot be both server and client");
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   152
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   153
    // enable graphics by default unless server
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   154
    if (!net_server)
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   155
        graphics_enabled = true;
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   156
    
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   157
    // continue
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   158
    return true;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   159
}
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   160
        
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   161
int Main::parse_arg_int (const std::string &arg_val, const char *arg_name) {
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   162
    int int_val;
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   163
    
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   164
    // read using istringstream
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   165
    std::istringstream ss(arg_val);
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   166
    
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   167
    if (!(ss >> int_val))
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   168
        throw ArgumentError(std::string() + "invalid integer arugment for " + arg_name + ": " + arg_val);
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   169
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   170
    return int_val;
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   171
}
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   172
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   173
PixelCoordinate Main::parse_arg_dimensions (const std::string &arg_val, const char *arg_name) {
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   174
    unsigned int w, h;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   175
    
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   176
    // sccanf as unsigned
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   177
    if (sscanf(arg_val.c_str(), "%ux%u", &w, &h) != 2)
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   178
        throw ArgumentError(std::string() + "invalid format for " + arg_name + ": " + arg_val);
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   179
    
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   180
    return PixelCoordinate(w, h);
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   181
}
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   182
        
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   183
void Main::dump_display_modes (void) {
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   184
    const std::vector<CL_DisplayMode> &modes = Graphics::getDisplayModes();
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   185
    
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   186
    std::cout << "Available display modes:" << std::endl;
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   187
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   188
    for (std::vector<CL_DisplayMode>::const_iterator it = modes.begin(); it != modes.end(); it++)
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   189
        std::cout << "\t" << it->get_resolution().width << "x" << it->get_resolution().height << std::endl;
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   190
}
397
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   191
        
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   192
void Main::dump_version (void) {
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   193
    std::cout << PROJECT_LONG_NAME << " version " << PROJECT_VERSION << " built " << PROJECT_BUILD_TIMESTAMP << std::endl;
13fa0546ef87 hopefully version stuff is now run properly on every make...
Tero Marttila <terom@fixme.fi>
parents: 392
diff changeset
   194
}
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   195
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   196
/**
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   197
 * IT BEGAN IN AFRIKA
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   198
 */
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   199
int Main::main (int argc, char **argv) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   200
    // initialize the ClanLib components that we use
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   201
    CL_SetupCore setup_core;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   202
    CL_SetupNetwork setup_network;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   203
    CL_SetupDisplay setup_disp;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   204
    CL_SetupGL setup_gl;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   205
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   206
    try {
389
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   207
        // parse arugments, exit if false
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   208
        if (parse_args(argc, argv) == false)
e74c1820fbd2 implement --help, --fullscreen, --resolution and --list-modes
Tero Marttila <terom@fixme.fi>
parents: 358
diff changeset
   209
            return 0;
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   210
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   211
        // our engine
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   212
        Engine engine;
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   213
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   214
        // setup game unless client
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   215
        if (net_connect.empty())
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   216
            engine.setupGame(terrain);
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   217
        
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   218
        // setup graphics
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   219
        if (graphics_enabled)
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 397
diff changeset
   220
            engine.setupGraphics(graphics);
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   221
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   222
        // setup either network server, client or singleplayer
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   223
        if (net_server) {
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   224
            engine.setupNetworkServer(net_port);
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   225
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   226
        } else if (!net_connect.empty()) {
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
   227
            engine.setupNetworkClient(net_connect, net_port);
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   228
        
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   229
        } else {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   230
            engine.setupSinglePlayer();
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   231
        }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   232
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   233
        // run the main loop
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   234
        engine.run();
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   235
        
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   236
        // succesful return
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   237
        return 0;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   238
    
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   239
    } catch (ArgumentError &e) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   240
        std::cerr << e.what() << std::endl;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   241
        args.print_help();
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   242
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   243
        // XXX: handle --help
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   244
        return 1;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   245
    } catch (CL_Error &e) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   246
        std::cerr << "main: CL_Error:" << e.message << std::endl;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   247
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   248
        return 1;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   249
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   250
    } catch (std::exception &e) {
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   251
        std::cerr << "FATAL [uncaught_exception] " << e.what() << std::endl;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   252
358
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   253
        return 1;
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   254
    }
37b18b779ffb PIMP MAH DOXYGEN
terom
parents: 267
diff changeset
   255
}
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   256