+void HandShake(void)
+{ //talk to your host
+ MyEvent event;
+
+ {
+ netint4 versiondata[2];
+ versiondata[0] = hton4(MAJOR_VERSION);
+ versiondata[1] = hton4(PROTOCOL_VERSION);
+ SendPacket(0, NP_hello, sizeof(versiondata), versiondata);
+ }
+
+ do {
+ if (WaitMyEvent(&event, EM_net) == E_net)
+ switch (event.u.net.type) {
+ case NP_hello:
+ {
+ me = event.u.net.uid;
+ memcpy(&Players[me], &Players[0], sizeof(_Player));
+ fprintf(stderr, "Accepted (%s) as #%d (%s)\n",
+ event.u.net.data, me, Players[me].name);
+ SendPacket(0, NP_newPlayer,
+ sizeof(_Player) - sizeof(Players[me].host),
+ &Players[me]);
+ break;
+ }
+ case NP_team:
+ { //receive your teamnumber
+ memcpy(&Players[event.u.net.uid].team, event.u.net.data,
+ event.u.net.size);
+ break;
+ } //NP_team
+ case NP_gamedata:
+ {
+ static struct {
+ int playerflags;
+ int maxplayers; //1
+ int started; //2
+ int continuous; //3
+ long seed; //4
+ int initspeed; //5
+ } data;
+
+ memcpy(&data, event.u.net.data, event.u.net.size);
+ memcpy(&Players[me].flags, &data, sizeof(data.playerflags));
+ memcpy(&Players[me].flags, &data, sizeof(data.playerflags));
+ memcpy(&Game, &data.maxplayers,
+ sizeof(data) - sizeof(data.playerflags));
+ break;
+ } //NP_gamedata
+ case NP_error:
+ {
+ fprintf(stderr, "Rejected by server: %s\n", event.u.net.data);
+ exit(1);
+ } //NP_error
+ default:
+ break;
+ }
+ else
+ fatal("Hm, the party apparantly ended prematurely.");
+ } while (event.u.net.type != NP_gamedata);
+}
+
+
+MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
+{ //receive