git repos / blockattack-game

blame: source/code/NetworkThing.hpp

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
89c4a3a6 sago007 2008-08-29 14:32 2
NetworkThing.hpp
89c4a3a6 sago007 2008-08-29 14:32 3
Copyright (C) 2007 Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 4
89c4a3a6 sago007 2008-08-29 14:32 5
    This program is free software; you can redistribute it and/or modify
89c4a3a6 sago007 2008-08-29 14:32 6
    it under the terms of the GNU General Public License as published by
89c4a3a6 sago007 2008-08-29 14:32 7
    the Free Software Foundation; either version 2 of the License, or
89c4a3a6 sago007 2008-08-29 14:32 8
    (at your option) any later version.
89c4a3a6 sago007 2008-08-29 14:32 9
89c4a3a6 sago007 2008-08-29 14:32 10
    This program is distributed in the hope that it will be useful,
89c4a3a6 sago007 2008-08-29 14:32 11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
89c4a3a6 sago007 2008-08-29 14:32 12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89c4a3a6 sago007 2008-08-29 14:32 13
    GNU General Public License for more details.
89c4a3a6 sago007 2008-08-29 14:32 14
89c4a3a6 sago007 2008-08-29 14:32 15
    You should have received a copy of the GNU General Public License
89c4a3a6 sago007 2008-08-29 14:32 16
    along with this program; if not, write to the Free Software
89c4a3a6 sago007 2008-08-29 14:32 17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
89c4a3a6 sago007 2008-08-29 14:32 18
89c4a3a6 sago007 2008-08-29 14:32 19
    Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 20
    R�veh�jvej 36, V. 1111
89c4a3a6 sago007 2008-08-29 14:32 21
    2800 Kgs. Lyngby
89c4a3a6 sago007 2008-08-29 14:32 22
    DENMARK
89c4a3a6 sago007 2008-08-29 14:32 23
    blockattack@poulsander.com
89c4a3a6 sago007 2008-08-29 14:32 24
*/
89c4a3a6 sago007 2008-08-29 14:32 25
2f30c381 sago007 2008-09-14 13:08 26
#if NETWORK
2f30c381 sago007 2008-09-14 13:08 27
89c4a3a6 sago007 2008-08-29 14:32 28
//The network interface
89c4a3a6 sago007 2008-08-29 14:32 29
class NetworkThing
89c4a3a6 sago007 2008-08-29 14:32 30
{
89c4a3a6 sago007 2008-08-29 14:32 31
private:
89c4a3a6 sago007 2008-08-29 14:32 32
    ENetAddress address;
89c4a3a6 sago007 2008-08-29 14:32 33
    ENetHost * server;
89c4a3a6 sago007 2008-08-29 14:32 34
    ENetHost * client;
89c4a3a6 sago007 2008-08-29 14:32 35
    ENetPeer *peer;
89c4a3a6 sago007 2008-08-29 14:32 36
89c4a3a6 sago007 2008-08-29 14:32 37
    BlockGame *bgHome, *bgAway; //Pointers to the two games, so we can call the procedures
89c4a3a6 sago007 2008-08-29 14:32 38
    bool weAreAServer, weAreAClient;
89c4a3a6 sago007 2008-08-29 14:32 39
    bool weAreConnected;
89c4a3a6 sago007 2008-08-29 14:32 40
    bool enemyIsReady;
89c4a3a6 sago007 2008-08-29 14:32 41
    bool enemyHasStarted; //If we should have a ready button
89c4a3a6 sago007 2008-08-29 14:32 42
    bool gameHasStarted; //If the player is GameOver it might just be because the game hasn't started yet... not if this is true!
89c4a3a6 sago007 2008-08-29 14:32 43
89c4a3a6 sago007 2008-08-29 14:32 44
public:
89c4a3a6 sago007 2008-08-29 14:32 45
89c4a3a6 sago007 2008-08-29 14:32 46
    Uint32 theSeed;
89c4a3a6 sago007 2008-08-29 14:32 47
89c4a3a6 sago007 2008-08-29 14:32 48
    NetworkThing()
89c4a3a6 sago007 2008-08-29 14:32 49
    {
89c4a3a6 sago007 2008-08-29 14:32 50
        weAreAServer = false;
89c4a3a6 sago007 2008-08-29 14:32 51
        weAreAClient = false;
89c4a3a6 sago007 2008-08-29 14:32 52
        weAreConnected = false;
89c4a3a6 sago007 2008-08-29 14:32 53
        enemyIsReady = false;
89c4a3a6 sago007 2008-08-29 14:32 54
        enemyHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 55
        gameHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 56
        if (enet_initialize () != 0)
89c4a3a6 sago007 2008-08-29 14:32 57
        {
89c4a3a6 sago007 2008-08-29 14:32 58
            fprintf (stderr, "An error occurred while initializing ENet.\n");
89c4a3a6 sago007 2008-08-29 14:32 59
        }
89c4a3a6 sago007 2008-08-29 14:32 60
        else
89c4a3a6 sago007 2008-08-29 14:32 61
        {
89c4a3a6 sago007 2008-08-29 14:32 62
            cout << "Network is working!" << endl;
89c4a3a6 sago007 2008-08-29 14:32 63
        }
89c4a3a6 sago007 2008-08-29 14:32 64
        //atexit (enet_deinitialize); in deconstructor
89c4a3a6 sago007 2008-08-29 14:32 65
    }
89c4a3a6 sago007 2008-08-29 14:32 66
89c4a3a6 sago007 2008-08-29 14:32 67
    //This function couses us to remove the connection to the other peer, plus destroying servers
89c4a3a6 sago007 2008-08-29 14:32 68
    void ntDisconnect()
89c4a3a6 sago007 2008-08-29 14:32 69
    {
89c4a3a6 sago007 2008-08-29 14:32 70
        strcpy(bgAway->name,player2name);
89c4a3a6 sago007 2008-08-29 14:32 71
        if (weAreConnected || weAreAClient || weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 72
        {
89c4a3a6 sago007 2008-08-29 14:32 73
            if (weAreAClient)
89c4a3a6 sago007 2008-08-29 14:32 74
            {
89c4a3a6 sago007 2008-08-29 14:32 75
                enet_peer_disconnect (peer,0);
89c4a3a6 sago007 2008-08-29 14:32 76
                SDL_Delay(20);
89c4a3a6 sago007 2008-08-29 14:32 77
                enet_host_destroy(client);
89c4a3a6 sago007 2008-08-29 14:32 78
                weAreAClient = false;
89c4a3a6 sago007 2008-08-29 14:32 79
                weAreConnected = false;
89c4a3a6 sago007 2008-08-29 14:32 80
                enemyHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 81
            }
89c4a3a6 sago007 2008-08-29 14:32 82
            if (weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 83
            {
89c4a3a6 sago007 2008-08-29 14:32 84
                enet_host_destroy(server);
89c4a3a6 sago007 2008-08-29 14:32 85
                weAreAServer = false;
89c4a3a6 sago007 2008-08-29 14:32 86
                weAreConnected = false;
89c4a3a6 sago007 2008-08-29 14:32 87
                enemyHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 88
            }
89c4a3a6 sago007 2008-08-29 14:32 89
            //If the game is running then we disconnect, we are considered the looser!
e1290bdf sago007 2010-10-25 19:56 90
            if ((!bgHome->isGameOver())&&(!bgAway->isGameOver()))
89c4a3a6 sago007 2008-08-29 14:32 91
            {
89c4a3a6 sago007 2008-08-29 14:32 92
                bgAway->setPlayerWon();
89c4a3a6 sago007 2008-08-29 14:32 93
                bgHome->SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 94
            }
89c4a3a6 sago007 2008-08-29 14:32 95
            gameHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 96
        }
89c4a3a6 sago007 2008-08-29 14:32 97
    };
89c4a3a6 sago007 2008-08-29 14:32 98
89c4a3a6 sago007 2008-08-29 14:32 99
    //Lets disconnect before we close...
89c4a3a6 sago007 2008-08-29 14:32 100
    ~NetworkThing()
89c4a3a6 sago007 2008-08-29 14:32 101
    {
89c4a3a6 sago007 2008-08-29 14:32 102
        cout << "Network system is going down" << endl;
89c4a3a6 sago007 2008-08-29 14:32 103
        ntDisconnect();
89c4a3a6 sago007 2008-08-29 14:32 104
        enet_deinitialize(); 
89c4a3a6 sago007 2008-08-29 14:32 105
        cout << "Network system went down" << endl;
89c4a3a6 sago007 2008-08-29 14:32 106
    }
89c4a3a6 sago007 2008-08-29 14:32 107
89c4a3a6 sago007 2008-08-29 14:32 108
    void theGameHasStarted()
89c4a3a6 sago007 2008-08-29 14:32 109
    {
89c4a3a6 sago007 2008-08-29 14:32 110
        gameHasStarted = true;
89c4a3a6 sago007 2008-08-29 14:32 111
    }
89c4a3a6 sago007 2008-08-29 14:32 112
89c4a3a6 sago007 2008-08-29 14:32 113
    //The NetworkThing needs to be able to call the models... here the pointers are set
89c4a3a6 sago007 2008-08-29 14:32 114
    void setBGpointers(BlockGame *bg1, BlockGame *bg2)
89c4a3a6 sago007 2008-08-29 14:32 115
    {
89c4a3a6 sago007 2008-08-29 14:32 116
        bgHome = bg1;
89c4a3a6 sago007 2008-08-29 14:32 117
        bgAway = bg2;
89c4a3a6 sago007 2008-08-29 14:32 118
    }
89c4a3a6 sago007 2008-08-29 14:32 119
89c4a3a6 sago007 2008-08-29 14:32 120
    //Starts a server instance
89c4a3a6 sago007 2008-08-29 14:32 121
    void startServer()
89c4a3a6 sago007 2008-08-29 14:32 122
    {
89c4a3a6 sago007 2008-08-29 14:32 123
        if (!weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 124
        {
89c4a3a6 sago007 2008-08-29 14:32 125
            ntDisconnect();
89c4a3a6 sago007 2008-08-29 14:32 126
89c4a3a6 sago007 2008-08-29 14:32 127
            /* Bind the server to the default localhost.     */
89c4a3a6 sago007 2008-08-29 14:32 128
            /* A specific host address can be specified by   */
89c4a3a6 sago007 2008-08-29 14:32 129
            /* enet_address_set_host (& address, "x.x.x.x"); */
89c4a3a6 sago007 2008-08-29 14:32 130
89c4a3a6 sago007 2008-08-29 14:32 131
            address.host = ENET_HOST_ANY;
89c4a3a6 sago007 2008-08-29 14:32 132
            /* Bind the server to port SERVERPORT. */
89c4a3a6 sago007 2008-08-29 14:32 133
            address.port = SERVERPORT;
89c4a3a6 sago007 2008-08-29 14:32 134
89c4a3a6 sago007 2008-08-29 14:32 135
            server = enet_host_create (& address /* the address to bind the server host to */,
89c4a3a6 sago007 2008-08-29 14:32 136
                                       1      /* allow up to 1 clients and/or outgoing connections */,
89c4a3a6 sago007 2008-08-29 14:32 137
                                       0      /* assume any amount of incoming bandwidth */,
89c4a3a6 sago007 2008-08-29 14:32 138
                                       0      /* assume any amount of outgoing bandwidth */);
89c4a3a6 sago007 2008-08-29 14:32 139
            if (server == NULL)
89c4a3a6 sago007 2008-08-29 14:32 140
            {
89c4a3a6 sago007 2008-08-29 14:32 141
                fprintf (stderr,
89c4a3a6 sago007 2008-08-29 14:32 142
                         "An error occurred while trying to create an ENet server host.\n");
89c4a3a6 sago007 2008-08-29 14:32 143
89c4a3a6 sago007 2008-08-29 14:32 144
            }
89c4a3a6 sago007 2008-08-29 14:32 145
            else
89c4a3a6 sago007 2008-08-29 14:32 146
            {
89c4a3a6 sago007 2008-08-29 14:32 147
                weAreAServer = true;
89c4a3a6 sago007 2008-08-29 14:32 148
                enemyIsReady = false;
89c4a3a6 sago007 2008-08-29 14:32 149
                gameHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 150
                cout << "Server is listening on port " << SERVERPORT << endl;
89c4a3a6 sago007 2008-08-29 14:32 151
            }
89c4a3a6 sago007 2008-08-29 14:32 152
        }
89c4a3a6 sago007 2008-08-29 14:32 153
    }
89c4a3a6 sago007 2008-08-29 14:32 154
89c4a3a6 sago007 2008-08-29 14:32 155
    void connectToServer(string server)
89c4a3a6 sago007 2008-08-29 14:32 156
    {
89c4a3a6 sago007 2008-08-29 14:32 157
        ENetAddress address;
89c4a3a6 sago007 2008-08-29 14:32 158
        ENetEvent event;
89c4a3a6 sago007 2008-08-29 14:32 159
89c4a3a6 sago007 2008-08-29 14:32 160
        enet_address_set_host (& address, server.c_str());
89c4a3a6 sago007 2008-08-29 14:32 161
        address.port = SERVERPORT;
89c4a3a6 sago007 2008-08-29 14:32 162
89c4a3a6 sago007 2008-08-29 14:32 163
        ntDisconnect();
89c4a3a6 sago007 2008-08-29 14:32 164
        client = enet_host_create (NULL /* create a client host */,
89c4a3a6 sago007 2008-08-29 14:32 165
                                   1 /* only allow 1 outgoing connection */,
89c4a3a6 sago007 2008-08-29 14:32 166
                                   0 /* Unlimited downstream bandwidth */,
89c4a3a6 sago007 2008-08-29 14:32 167
                                   0 /* Unlimted upstream bandwidth */);
89c4a3a6 sago007 2008-08-29 14:32 168
89c4a3a6 sago007 2008-08-29 14:32 169
        if (client == NULL)
89c4a3a6 sago007 2008-08-29 14:32 170
        {
89c4a3a6 sago007 2008-08-29 14:32 171
            cout << "An error occurred while trying to create an ENet client host." << endl;
89c4a3a6 sago007 2008-08-29 14:32 172
        }
89c4a3a6 sago007 2008-08-29 14:32 173
        else
89c4a3a6 sago007 2008-08-29 14:32 174
        {
89c4a3a6 sago007 2008-08-29 14:32 175
            /* Initiate the connection, allocating the four channels 0 and 1 and 2 and 3. */
89c4a3a6 sago007 2008-08-29 14:32 176
            peer = enet_host_connect (client, & address, 4);
89c4a3a6 sago007 2008-08-29 14:32 177
89c4a3a6 sago007 2008-08-29 14:32 178
            if (peer == NULL)
89c4a3a6 sago007 2008-08-29 14:32 179
            {
89c4a3a6 sago007 2008-08-29 14:32 180
                cout << "No available peers for initiating an ENet connection." << endl;
89c4a3a6 sago007 2008-08-29 14:32 181
            }
89c4a3a6 sago007 2008-08-29 14:32 182
            else
89c4a3a6 sago007 2008-08-29 14:32 183
                if (enet_host_service (client, & event, 2000) > 0 &&
89c4a3a6 sago007 2008-08-29 14:32 184
                        event.type == ENET_EVENT_TYPE_CONNECT)
89c4a3a6 sago007 2008-08-29 14:32 185
                {
89c4a3a6 sago007 2008-08-29 14:32 186
                    cout << "We are connected!" << endl;
89c4a3a6 sago007 2008-08-29 14:32 187
                    enemyIsReady = false;
89c4a3a6 sago007 2008-08-29 14:32 188
                    weAreAClient = true;
89c4a3a6 sago007 2008-08-29 14:32 189
                    weAreConnected = true;
89c4a3a6 sago007 2008-08-29 14:32 190
                    gameHasStarted = false;
89c4a3a6 sago007 2008-08-29 14:32 191
                }
89c4a3a6 sago007 2008-08-29 14:32 192
                else
89c4a3a6 sago007 2008-08-29 14:32 193
                {
89c4a3a6 sago007 2008-08-29 14:32 194
                    cout << "Server didn't answer in time" << endl;
89c4a3a6 sago007 2008-08-29 14:32 195
                }
89c4a3a6 sago007 2008-08-29 14:32 196
        }
89c4a3a6 sago007 2008-08-29 14:32 197
    }
89c4a3a6 sago007 2008-08-29 14:32 198
89c4a3a6 sago007 2008-08-29 14:32 199
    bool isConnected()
89c4a3a6 sago007 2008-08-29 14:32 200
    {
89c4a3a6 sago007 2008-08-29 14:32 201
        return (weAreConnected||weAreAServer);
89c4a3a6 sago007 2008-08-29 14:32 202
    }
89c4a3a6 sago007 2008-08-29 14:32 203
89c4a3a6 sago007 2008-08-29 14:32 204
    bool isConnectedToPeer()
89c4a3a6 sago007 2008-08-29 14:32 205
    {
89c4a3a6 sago007 2008-08-29 14:32 206
        return weAreConnected;
89c4a3a6 sago007 2008-08-29 14:32 207
    }
89c4a3a6 sago007 2008-08-29 14:32 208
89c4a3a6 sago007 2008-08-29 14:32 209
    //This function must be called in the game loop:
89c4a3a6 sago007 2008-08-29 14:32 210
    void updateNetwork()
89c4a3a6 sago007 2008-08-29 14:32 211
    {
89c4a3a6 sago007 2008-08-29 14:32 212
        //Now we must send our own board:
89c4a3a6 sago007 2008-08-29 14:32 213
        if (weAreConnected)
89c4a3a6 sago007 2008-08-29 14:32 214
        {
89c4a3a6 sago007 2008-08-29 14:32 215
            //cout << "Creating package" << endl;
89c4a3a6 sago007 2008-08-29 14:32 216
            boardPackage boardpack = bgHome->getPackage();
89c4a3a6 sago007 2008-08-29 14:32 217
            ENetPacket * packet = enet_packet_create (&boardpack,
89c4a3a6 sago007 2008-08-29 14:32 218
                                  sizeof(boardPackage),
89c4a3a6 sago007 2008-08-29 14:32 219
                                  0);
89c4a3a6 sago007 2008-08-29 14:32 220
            //Now lets send the package
89c4a3a6 sago007 2008-08-29 14:32 221
            if (weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 222
                enet_host_broadcast (server, 0, packet);
89c4a3a6 sago007 2008-08-29 14:32 223
            else
89c4a3a6 sago007 2008-08-29 14:32 224
                if (weAreAClient)
89c4a3a6 sago007 2008-08-29 14:32 225
                    enet_peer_send (peer, 0, packet);
89c4a3a6 sago007 2008-08-29 14:32 226
            //cout << "Package sent" << endl;
89c4a3a6 sago007 2008-08-29 14:32 227
89c4a3a6 sago007 2008-08-29 14:32 228
            //See if we are game over and in that case notify the other player
e1290bdf sago007 2010-10-25 19:56 229
            if ((gameHasStarted)&&(bgHome->isGameOver()))
89c4a3a6 sago007 2008-08-29 14:32 230
            {
89c4a3a6 sago007 2008-08-29 14:32 231
                ENetPacket * packet = enet_packet_create("G",2,ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 232
                if (weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 233
                    enet_host_broadcast (server, 1, packet);
89c4a3a6 sago007 2008-08-29 14:32 234
                else
89c4a3a6 sago007 2008-08-29 14:32 235
                    if (weAreAClient)
89c4a3a6 sago007 2008-08-29 14:32 236
                        enet_peer_send (peer, 1, packet);
89c4a3a6 sago007 2008-08-29 14:32 237
                gameHasStarted=false;
89c4a3a6 sago007 2008-08-29 14:32 238
            }
89c4a3a6 sago007 2008-08-29 14:32 239
89c4a3a6 sago007 2008-08-29 14:32 240
            //Now lets see if we have something to throw at the opponent.
89c4a3a6 sago007 2008-08-29 14:32 241
            Uint8 x,y,type;
89c4a3a6 sago007 2008-08-29 14:32 242
89c4a3a6 sago007 2008-08-29 14:32 243
            if (gameHasStarted)
89c4a3a6 sago007 2008-08-29 14:32 244
                while (bgAway->popGarbage(&x,&y,&type))
89c4a3a6 sago007 2008-08-29 14:32 245
                { //if there are garbage to drop
89c4a3a6 sago007 2008-08-29 14:32 246
                    if (type==1)
89c4a3a6 sago007 2008-08-29 14:32 247
                    {
89c4a3a6 sago007 2008-08-29 14:32 248
                        x=255;
89c4a3a6 sago007 2008-08-29 14:32 249
                        y=255;
89c4a3a6 sago007 2008-08-29 14:32 250
                    }
89c4a3a6 sago007 2008-08-29 14:32 251
                    Uint16 g = ((Uint16)x)*256+(Uint16)y; //A 16-bit int containing everything
89c4a3a6 sago007 2008-08-29 14:32 252
                    ENetPacket * packet = enet_packet_create(&g,2,ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 253
                    if (weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 254
                        enet_host_broadcast (server, 2, packet);
89c4a3a6 sago007 2008-08-29 14:32 255
                    else
89c4a3a6 sago007 2008-08-29 14:32 256
                        if (weAreAClient)
89c4a3a6 sago007 2008-08-29 14:32 257
                            enet_peer_send (peer, 2, packet);
89c4a3a6 sago007 2008-08-29 14:32 258
                    cout << "We send a garbage block: " << (int)x << "," << (int)y << "==" << g << endl;
89c4a3a6 sago007 2008-08-29 14:32 259
                }
89c4a3a6 sago007 2008-08-29 14:32 260
        }
89c4a3a6 sago007 2008-08-29 14:32 261
        ENetEvent event;
89c4a3a6 sago007 2008-08-29 14:32 262
89c4a3a6 sago007 2008-08-29 14:32 263
        /* Wait up to 0 milliseconds for an event. */
89c4a3a6 sago007 2008-08-29 14:32 264
        while (((weAreAClient)&&(enet_host_service (client, & event, 0) > 0))||((weAreAServer)&&(enet_host_service (server, & event, 0) > 0)))
89c4a3a6 sago007 2008-08-29 14:32 265
        {
89c4a3a6 sago007 2008-08-29 14:32 266
            switch (event.type)
89c4a3a6 sago007 2008-08-29 14:32 267
            {
89c4a3a6 sago007 2008-08-29 14:32 268
            case ENET_EVENT_TYPE_CONNECT:
89c4a3a6 sago007 2008-08-29 14:32 269
                printf ("A new client connected from %x:%u.\n",
89c4a3a6 sago007 2008-08-29 14:32 270
                        event.peer -> address.host,
89c4a3a6 sago007 2008-08-29 14:32 271
                        event.peer -> address.port);
89c4a3a6 sago007 2008-08-29 14:32 272
                weAreConnected = true;
89c4a3a6 sago007 2008-08-29 14:32 273
                /* Store any relevant client information here. */
89c4a3a6 sago007 2008-08-29 14:32 274
                //event.peer -> data = "Client";
89c4a3a6 sago007 2008-08-29 14:32 275
                {
89c4a3a6 sago007 2008-08-29 14:32 276
89c4a3a6 sago007 2008-08-29 14:32 277
                    ENetPacket * namePacket = enet_packet_create(bgHome->name,sizeof(char[30]),ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 278
                    //if(weAreAServer)
89c4a3a6 sago007 2008-08-29 14:32 279
                    enet_host_broadcast (server, 3, namePacket);
a3671ee6 sago007 2009-04-03 23:23 280
                    ENetPacket * answerPacket = enet_packet_create("version3",sizeof("version3"),ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 281
                    enet_host_broadcast (server, 3, answerPacket);
89c4a3a6 sago007 2008-08-29 14:32 282
                    theSeed = time(0)/4;
89c4a3a6 sago007 2008-08-29 14:32 283
                    bgHome->putStartBlocks(theSeed);
89c4a3a6 sago007 2008-08-29 14:32 284
                    ENetPacket * timePacket = enet_packet_create(&theSeed,sizeof(theSeed),ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 285
                    enet_host_broadcast (server, 3, timePacket);
89c4a3a6 sago007 2008-08-29 14:32 286
                    cout << "We send the seed: " << theSeed << endl;
89c4a3a6 sago007 2008-08-29 14:32 287
                }
89c4a3a6 sago007 2008-08-29 14:32 288
                break;
89c4a3a6 sago007 2008-08-29 14:32 289
89c4a3a6 sago007 2008-08-29 14:32 290
            case ENET_EVENT_TYPE_RECEIVE:
89c4a3a6 sago007 2008-08-29 14:32 291
                /*printf ("A packet of length %u containing %s was received from %s on channel %u.\n",
89c4a3a6 sago007 2008-08-29 14:32 292
                    event.packet -> dataLength,
89c4a3a6 sago007 2008-08-29 14:32 293
                    event.packet -> data,
89c4a3a6 sago007 2008-08-29 14:32 294
                    event.peer -> data,
89c4a3a6 sago007 2008-08-29 14:32 295
                    event.channelID);*/
89c4a3a6 sago007 2008-08-29 14:32 296
                //cout << "Package recieved" << endl;
89c4a3a6 sago007 2008-08-29 14:32 297
                if (event.channelID==0) //Unreliable (only boardPacks)
89c4a3a6 sago007 2008-08-29 14:32 298
                {
89c4a3a6 sago007 2008-08-29 14:32 299
                    boardPackage bpack;
89c4a3a6 sago007 2008-08-29 14:32 300
                    //cout << "Package size: "<< event.packet->dataLength << " should be: " << sizeof(boardPackage) << endl;
89c4a3a6 sago007 2008-08-29 14:32 301
                    memcpy(&bpack,(const char*)event.packet->data,sizeof(boardPackage));
89c4a3a6 sago007 2008-08-29 14:32 302
                    bgAway->setBoard(bpack);
89c4a3a6 sago007 2008-08-29 14:32 303
                }
89c4a3a6 sago007 2008-08-29 14:32 304
                if (event.channelID==1) //reliable (used for GameOver notifications only!)
89c4a3a6 sago007 2008-08-29 14:32 305
                {
e1290bdf sago007 2010-10-25 19:56 306
                    if ((bgHome->isGameOver())&&(!bgHome->GetIsWinner())&&(gameHasStarted))
89c4a3a6 sago007 2008-08-29 14:32 307
                    {
89c4a3a6 sago007 2008-08-29 14:32 308
                        bgHome->setDraw();
89c4a3a6 sago007 2008-08-29 14:32 309
                        bgAway->setDraw();
89c4a3a6 sago007 2008-08-29 14:32 310
                    }
89c4a3a6 sago007 2008-08-29 14:32 311
                    else
89c4a3a6 sago007 2008-08-29 14:32 312
                    {
89c4a3a6 sago007 2008-08-29 14:32 313
                        bgHome->setPlayerWon();
89c4a3a6 sago007 2008-08-29 14:32 314
                        bgAway->SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 315
                    }
89c4a3a6 sago007 2008-08-29 14:32 316
                    gameHasStarted=false;
89c4a3a6 sago007 2008-08-29 14:32 317
                }
89c4a3a6 sago007 2008-08-29 14:32 318
89c4a3a6 sago007 2008-08-29 14:32 319
                if (event.channelID==2) //reliable (used for Garbage only!)
89c4a3a6 sago007 2008-08-29 14:32 320
                {
89c4a3a6 sago007 2008-08-29 14:32 321
                    Uint16 g;
89c4a3a6 sago007 2008-08-29 14:32 322
                    memcpy(&g,event.packet->data,sizeof(Uint16));
89c4a3a6 sago007 2008-08-29 14:32 323
                    Uint8 x = (g/256);
89c4a3a6 sago007 2008-08-29 14:32 324
                    Uint8 y = (g%256);
89c4a3a6 sago007 2008-08-29 14:32 325
                    cout << "Recieved Garbage: " << (int)x << "," << (int)y << endl;
89c4a3a6 sago007 2008-08-29 14:32 326
                    if ((x==255)&&(y==255))
89c4a3a6 sago007 2008-08-29 14:32 327
                        bgHome->CreateGreyGarbage();
89c4a3a6 sago007 2008-08-29 14:32 328
                    else
89c4a3a6 sago007 2008-08-29 14:32 329
                        bgHome->CreateGarbage(x,y);
89c4a3a6 sago007 2008-08-29 14:32 330
                }
89c4a3a6 sago007 2008-08-29 14:32 331
89c4a3a6 sago007 2008-08-29 14:32 332
                if (event.channelID==3) //We have reacieved a name or a version number
89c4a3a6 sago007 2008-08-29 14:32 333
                {
89c4a3a6 sago007 2008-08-29 14:32 334
                    if (event.packet->dataLength==sizeof(char[30])) //We have reveived a name
89c4a3a6 sago007 2008-08-29 14:32 335
                    {
89c4a3a6 sago007 2008-08-29 14:32 336
                        strcpy(bgAway->name,(const char*)event.packet->data);
89c4a3a6 sago007 2008-08-29 14:32 337
                        cout << "The enemy name is: " << bgAway->name << " Length: " << sizeof(char[30])<< endl;
89c4a3a6 sago007 2008-08-29 14:32 338
                        if (weAreAClient) //We have just recieved the servers name and must send our own
89c4a3a6 sago007 2008-08-29 14:32 339
                        {
89c4a3a6 sago007 2008-08-29 14:32 340
                            ENetPacket * answerPacket = enet_packet_create(bgHome->name,sizeof(char[30]),ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 341
                            enet_peer_send (peer, 3, answerPacket);
89c4a3a6 sago007 2008-08-29 14:32 342
                        }
89c4a3a6 sago007 2008-08-29 14:32 343
                    }
89c4a3a6 sago007 2008-08-29 14:32 344
                    else
a3671ee6 sago007 2009-04-03 23:23 345
                        if (event.packet->dataLength==sizeof("version3")) //We have recieved aversion number
89c4a3a6 sago007 2008-08-29 14:32 346
                        {
a3671ee6 sago007 2009-04-03 23:23 347
                            if (0!=strcmp((const char*)event.packet->data,"version3"))
89c4a3a6 sago007 2008-08-29 14:32 348
                            {
a3671ee6 sago007 2009-04-03 23:23 349
                                cout << "Incompatible version: " << event.packet->data << "!=" << "version3" << endl;
89c4a3a6 sago007 2008-08-29 14:32 350
                                ntDisconnect();
89c4a3a6 sago007 2008-08-29 14:32 351
                            }
89c4a3a6 sago007 2008-08-29 14:32 352
                            if (weAreAClient) //We will send our version number
89c4a3a6 sago007 2008-08-29 14:32 353
                            {
a3671ee6 sago007 2009-04-03 23:23 354
                                ENetPacket * answerPacket = enet_packet_create("version3",sizeof("version3"),ENET_PACKET_FLAG_RELIABLE);
89c4a3a6 sago007 2008-08-29 14:32 355
                                enet_peer_send (peer, 3, answerPacket);
89c4a3a6 sago007 2008-08-29 14:32 356
                            }
89c4a3a6 sago007 2008-08-29 14:32 357
                        }
89c4a3a6 sago007 2008-08-29 14:32 358
                        else
89c4a3a6 sago007 2008-08-29 14:32 359
                            if (event.packet->dataLength==sizeof(Uint32)) //We have recieved a seed
89c4a3a6 sago007 2008-08-29 14:32 360
                            {
89c4a3a6 sago007 2008-08-29 14:32 361
                                memcpy(&theSeed,event.packet->data,sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 362
                                bgHome->putStartBlocks(theSeed);
89c4a3a6 sago007 2008-08-29 14:32 363
                                cout << "We recieved a seed: " << theSeed << endl;
89c4a3a6 sago007 2008-08-29 14:32 364
                            }
89c4a3a6 sago007 2008-08-29 14:32 365
                }
89c4a3a6 sago007 2008-08-29 14:32 366
89c4a3a6 sago007 2008-08-29 14:32 367
                /* Clean up the packet now that we're done using it. */
89c4a3a6 sago007 2008-08-29 14:32 368
                enet_packet_destroy (event.packet);
89c4a3a6 sago007 2008-08-29 14:32 369
89c4a3a6 sago007 2008-08-29 14:32 370
                break;
89c4a3a6 sago007 2008-08-29 14:32 371
89c4a3a6 sago007 2008-08-29 14:32 372
            case ENET_EVENT_TYPE_DISCONNECT:
78d03b38 sago007 2008-11-13 19:56 373
                //printf ("%s disconected.\n", event.peer -> data);
78d03b38 sago007 2008-11-13 19:56 374
                cout << event.peer -> data << " disconnected." << endl;
89c4a3a6 sago007 2008-08-29 14:32 375
89c4a3a6 sago007 2008-08-29 14:32 376
                /* Reset the peer's client information. */
89c4a3a6 sago007 2008-08-29 14:32 377
89c4a3a6 sago007 2008-08-29 14:32 378
                event.peer -> data = NULL;
89c4a3a6 sago007 2008-08-29 14:32 379
                //weAreConnected = false;
e1290bdf sago007 2010-10-25 19:56 380
                if ((!bgHome->isGameOver())&&(!bgAway->isGameOver()))
89c4a3a6 sago007 2008-08-29 14:32 381
                {
89c4a3a6 sago007 2008-08-29 14:32 382
                    bgHome->setPlayerWon();
89c4a3a6 sago007 2008-08-29 14:32 383
                    bgAway->SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 384
                }
89c4a3a6 sago007 2008-08-29 14:32 385
89c4a3a6 sago007 2008-08-29 14:32 386
                ntDisconnect(); //When we will disconnect!
89c4a3a6 sago007 2008-08-29 14:32 387
89c4a3a6 sago007 2008-08-29 14:32 388
            }
89c4a3a6 sago007 2008-08-29 14:32 389
        }
89c4a3a6 sago007 2008-08-29 14:32 390
89c4a3a6 sago007 2008-08-29 14:32 391
89c4a3a6 sago007 2008-08-29 14:32 392
    }
89c4a3a6 sago007 2008-08-29 14:32 393
}; //NetworkThing
2f30c381 sago007 2008-09-14 13:08 394
2f30c381 sago007 2008-09-14 13:08 395
#endif
1970-01-01 00:00 396