src/proto2/Application.cc
author terom
Thu, 20 Nov 2008 22:10:28 +0000
branchno-netsession
changeset 38 4189b8bf3a5b
parent 36 785d220fc6b7
permissions -rw-r--r--
kind of works
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     1
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     2
#include "Engine.hh"
36
terom
parents: 35
diff changeset
     3
#include "Error.hh"
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     4
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     5
#include <stdexcept>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     6
#include <cassert>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     7
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     8
#include <ClanLib/core.h>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     9
#include <ClanLib/application.h>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    10
36
terom
parents: 35
diff changeset
    11
class ArgumentError : public Error {
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    12
    public:
36
terom
parents: 35
diff changeset
    13
        ArgumentError (const std::string &message) : Error(message) { }
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    14
};
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    15
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    16
class Main : public CL_ClanApplication {
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    17
    private:
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    18
        // arguments
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    19
        CL_CommandLine args;
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    20
        
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    21
        bool arg_graphics;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    22
        std::string arg_port;
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    23
        bool arg_server;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    24
        std::string arg_connect;
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    25
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    26
        void parse_args (int argc, char **argv) {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    27
            // set up the options
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    28
            args.add_option('p', "port", "PORT", "set network port used", true);
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    29
            args.add_option('s', "server", "", "act as a network server", true);
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    30
            args.add_option('c', "client", "SERVERHOST", "act as a network client", true);
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    31
            args.add_option('g', "graphics", "", "run graphics/local input. Implied with --connect", true);
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    32
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    33
            // set defaults
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    34
            arg_graphics = false;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    35
            arg_port = NETWORK_PORT_STR;
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    36
            arg_server = false;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    37
            arg_connect = "";
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    38
            
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    39
            try {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    40
                // parse args
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    41
                args.parse_args(argc, argv);
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    42
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    43
            } catch (CL_Error &e) {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    44
                throw ArgumentError(e.message);
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    45
            }
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    46
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    47
            while (args.next()) {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    48
                switch (args.get_key()) {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    49
                    case 'p':
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    50
                        arg_port = args.get_argument();
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    51
                        break;
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    52
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    53
                    case 's':
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    54
                        arg_server = true;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    55
                        break;
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    56
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    57
                    case 'c':
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    58
                        arg_connect = args.get_argument();
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    59
                        arg_graphics = true;
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    60
                        break;
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    61
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    62
                    case 'g':
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    63
                        arg_graphics = true;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    64
                        break;
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    65
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    66
                    case CL_CommandLine::REST_ARG:
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    67
                        throw ArgumentError(args.get_argument());
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    68
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    69
                    default:
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    70
                        throw ArgumentError(std::string(1, (char) args.get_key()));
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    71
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    72
                }
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    73
            }
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    74
            
35
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
    75
            // check for invalid combinations of arugments
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
    76
            if (arg_server and !arg_connect.empty())
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
    77
                throw ArgumentError("cannot be both server and client");
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    78
        }
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    79
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    80
    public:
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    81
        virtual int main (int argc, char **argv) {
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    82
            // initialize the ClanLib components that we use
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    83
            CL_SetupCore setup_core;
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    84
            CL_SetupNetwork setup_network;
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    85
            CL_SetupDisplay setup_disp;
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    86
            CL_SetupGL setup_gl;
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    87
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    88
            try {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    89
                // parse arugments
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    90
                parse_args(argc, argv);
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    91
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    92
                // our engine
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    93
                Engine engine;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
    94
                
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    95
                // setup graphics
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    96
                if (arg_graphics)
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    97
                    engine.setupGraphics();
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
    98
35
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
    99
                // setup either network server, client or singleplayer
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   100
                if (arg_server) {
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   101
                    engine.setupNetworkServer(arg_port);
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   102
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   103
                } else if (!arg_connect.empty()) {
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   104
                    engine.setupNetworkClient(arg_connect, arg_port);
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   105
                
35
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
   106
                } else {
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
   107
                    engine.setupSinglePlayer();
e21cfda0edde Merge from at r31:36
terom
parents: 25
diff changeset
   108
                }
25
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   109
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   110
                // run the main loop
af75a1894a32 simple proto *almost* works
terom
parents: 24
diff changeset
   111
                engine.run();
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   112
                
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   113
                // succesful return
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   114
                return 0;
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   115
            
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   116
            } catch (ArgumentError &e) {
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   117
                std::cerr << e.what() << std::endl;
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   118
                args.print_help();
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   119
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   120
                // XXX: handle --help
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   121
                return 1;
38
4189b8bf3a5b kind of works
terom
parents: 36
diff changeset
   122
            } catch (CL_Error &e) {
4189b8bf3a5b kind of works
terom
parents: 36
diff changeset
   123
                std::cerr << "main: CL_Error:" << e.message << std::endl;
4189b8bf3a5b kind of works
terom
parents: 36
diff changeset
   124
4189b8bf3a5b kind of works
terom
parents: 36
diff changeset
   125
                return 1;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   126
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   127
            } catch (std::exception &e) {
38
4189b8bf3a5b kind of works
terom
parents: 36
diff changeset
   128
                std::cerr << "FATAL [uncaught_exception] " << e.what() << std::endl;
24
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   129
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   130
                return 1;
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   131
            }
b81cb670e6b2 the great :retab
terom
parents: 22
diff changeset
   132
        }
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   133
} app;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   134