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